package xyz.heyaoshare.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimal工具类
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/30 上午10:58
 */
public class BigDecimalUtils {

    /**
     * 加法运算
     *
     * @param value1 第一个加数
     * @param value2 第二个加数
     * @return 和
     */
    public static BigDecimal add(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.add(value2);
    }

    /**
     * 减法运算
     *
     * @param value1 被减数
     * @param value2 减数
     * @return 差
     */
    public static BigDecimal subtract(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.subtract(value2);
    }

    /**
     * 乘法运算
     *
     * @param value1 被乘数
     * @param value2 乘数
     * @return 积
     */
    public static BigDecimal multiply(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.multiply(value2);
    }

    /**
     * 除法运算
     *
     * @param value1 被除数
     * @param value2 除数
     * @param scale  精度（小数点后保留的位数）
     * @return 商
     * @throws ArithmeticException 如果除数为零
     */
    public static BigDecimal divide(BigDecimal value1, BigDecimal value2, int scale) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null || value2.compareTo(BigDecimal.ZERO) == 0) {
            throw new ArithmeticException("除数不能为零");
        }
        return value1.divide(value2, scale, RoundingMode.HALF_UP);
    }

    /**
     * 四舍五入
     *
     * @param value 原始值
     * @param scale 精度（小数点后保留的位数）
     * @return 四舍五入后的值
     */
    public static BigDecimal round(BigDecimal value, int scale) {
        if (value == null) {
            value = BigDecimal.ZERO.setScale(scale, RoundingMode.HALF_UP);
        }
        return value.setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 四舍五入保留两位小数
     * @param value 输入的BigDecimal值
     * @return 四舍五入后保留两位小数的结果
     */
    public static BigDecimal round(BigDecimal value) {
        if (value == null) {
            value = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
        }
        return value.setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 比较两个 BigDecimal 值。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 1 如果 value1 大于 value2，
     *        -1 如果 value1 小于 value2，
     *         0 如果 value1 等于 value2。
     */
    public static int compare(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2);
    }

    /**
     * 判断第一个 BigDecimal 值是否大于第二个值。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 如果 value1 大于 value2，则返回 true，否则返回 false。
     */
    public static boolean isGreaterThan(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2) > 0;
    }

    /**
     * 判断第一个 BigDecimal 值是否小于第二个值。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 如果 value1 小于 value2，则返回 true，否则返回 false。
     */
    public static boolean isLessThan(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2) < 0;
    }

    /**
     * 判断两个 BigDecimal 值是否相等。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 如果 value1 等于 value2，则返回 true，否则返回 false。
     */
    public static boolean isEqualTo(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2) == 0;
    }

    /**
     * 判断第一个 BigDecimal 值是否大于等于第二个值。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 如果 value1 大于等于 value2，则返回 true，否则返回 false。
     */
    public static boolean isGreaterThanOrEqualTo(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2) >= 0;
    }

    /**
     * 判断第一个 BigDecimal 值是否小于等于第二个值。
     *
     * @param value1 第一个 BigDecimal 值。
     * @param value2 第二个 BigDecimal 值。
     * @return 如果 value1 小于等于 value2，则返回 true，否则返回 false。
     */
    public static boolean isLessThanOrEqualTo(BigDecimal value1, BigDecimal value2) {
        if (value1 == null) {
            value1 = BigDecimal.ZERO;
        }
        if (value2 == null) {
            value2 = BigDecimal.ZERO;
        }
        return value1.compareTo(value2) <= 0;
    }


}
